Лимит операций, обычно это беда настигает заядлых гуишников.
На jass обычно нету таких проблем.
Создайте таймер с периодом .00 сек и запускайте им функции инициализации триггеров.
функция типа InitTrig_Имя триггера - это функция инициализации триггера, она вызывается из функции InitCustomTriggers, но если этих вызовов очень много то функция упирается в лимит операций и поток завершается так и не создав все триггеры.
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности. Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.
В хеш-таблице изначально возвращает null (это если ничего не записано). Помню делал похожую систему только с итемами, при проверке через Load... проверял не пуста ли ячейка (!=null). По какой-то причине, уже не помню, не всегда так работает, неизвестно от чего система не работает, щас лень браться и искать ошибку.
В вашем понимании null на jass:
null = Нет боевая единица.
Ответ: чтобы записать null, ничего не надо записывать. Чтобы записать ноль у целого (0) или вещественного (0.00) числа, тоже ничего не надо перезаписывать. Если ничего не записано, вернет null или ноль. Пользуемся дебагами и проверяем.
Еще не попутал ли ты ключи местами? Там на гуи 1, 2 на jass перевернуть надо типа 2, 1. Смотрим
смотрим
есть BJ тоже гуи-команды. конвентируем в код и видим есть SaveUnitHandleBJ и SaveUnitHandle. Нужно представить ключи в таком порядке в каком изложены в нативке SaveUnitHandle а не в SaveUnitHandleBJ (ибо потом вас гуи путает): parentKey - родительский ключ childKey - младший ключ
представить хэш-таблицу можно как таблицу Excel, parentKey как строку, а childKey как столбик. И по этим вы находите ячейку. Еще в плюсе хэндлы юзать, по хэндлам будете строки находить. Стираете инфу тоже по хэндлу, по родительскому ключу. А если нужно стереть строку используйте FlushChildHashtable
Просто предметы перестают быть триггерно скрытыми после загрузки сохранения. Надо делать либо по твоему варианту, то есть создавать предмет, либо по варианту ssbbssc, то есть куда-то переносить предметы при инициализации карты, а в нужный момент возвращать на старые позиции.
Ещё при загрузке слетает цвет воды и освещение, если они нестандартные. Нужно задавать их в триггере с событием Игра загружена.
Если цвет воде можно задать в GUI, то для освещения потребуется Custom Script. Вот тут мне помогли нестандартное освещение опять задать:
Ещё сложность в дополнительных кампаниях сбрасывается после каждой главы, но вроде бы ты не пользуешься уровнями сложности. Сбрасывается, когда нажимаешь Продолжить, а если выходишь на экран кампании с кнопками глав, то всё нормально.
По идее с событием Игра загружена можно и с предметами аналогично поступать, скрывая их, если они ещё не активированы. Но потребуется вводить ещё переменные, которые будут указывать видимость или невидимость у предмета.
Таких багов много, почему то оптимизатор берет данные из слк таблиц игры на часть объектов, пробуй wc3ultimate opt, на хайве выложена... Мб кто уже и новый виджитайзер запилил.
стремиться создавать объекты не на карте, а в триггерах, сохраняя ссылки на нужные из них;
там, где в гуи открываются окна со списком из РО, использовать джасс и вводить равкод, а там, где список расставленных на карте юнитов, использовать переменные;
в РО с полями, где указаны объекты, работать через Shift+Enter и вводить равкод, чтобы не открывать список.
В общем покопался,
Цвета находятся в \ReplaceableTextures\TeamColor\
Внутри 16 текстур TeamColorXX.blp (где ХХ от 00 до 15) которые имеют свои цвета. (размер 8х8)
Внутри карты их заменить нельзя (приоритет на чтении из war3.mpq)
Так же там есть героическое свечение, находится в \ReplaceableTextures\TeamGlow\
Очень жаль что нельзя сменить цвет средствами карты. Это бы открыло большие возможности. (например сделать 15 разных покрасок одной и той же модели)
Сделать свою способность на основе Канала, настроить применение на точку. При событии каста создавать юнитов в точке каста. Все необходимое есть в статьях ( тут и тут).
Сделай спел на основе канала, при применении создаёшь руну с дождём и даёшь герою, ИЛИ создаёшь даммика и приказываешь ему кастовать дождь, но с руной всё же лучше.
Дальше пришла в голову другая идея. Думаю, можно сделать с помощью ремонта зданий Альянса: на месте смерти героя создаётся здание с моделью креста со здоровьем 1/100 ед., а союзные герои ремонтируя крест будут повышать её здоровье, получается некая иллюзия прогресс бара. И если спрятать способность ремонта с помощью функции HideAbilityButton( ) из мемхака, то будет ли она срабатывать при нажатии на ПКМ? Также, как отловить момент полного ремонта здания? С помощью таймера проверять процент здоровья каждые доли секунды?
раскрыть
scope HeroRevive initializer Initialization
struct herorevive
private unit dyingUnit
private unit reincarnate
private real life
private thistype prev
private thistype next
public static constant trigger trig = CreateTrigger( )
public static constant timer period = CreateTimer( )
private static method iterate takes nothing returns nothing
local thistype this = thistype( 0 ).next
loop
exitwhen ( this == 0 )
if ( GetWidgetLife( this.reincarnate ) > this.life ) then
set this.life = GetWidgetLife( this.reincarnate )
elseif ( GetWidgetLife( this.reincarnate ) >= GetUnitState( this.reincarnate, UNIT_STATE_MAX_LIFE ) ) then
call ReviveHero( this.dyingUnit, GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), true )
call RemoveUnit( this.reincarnate )
set this.reincarnate = null
set this.life = 0.0
set this.prev.next = this.next
set this.next.prev = this.prev
if ( thistype( 0 ).next == 0 ) then
call PauseTimer( thistype.period )
endif
call thistype.deallocate( this )
elseif ( GetWidgetLife( this.reincarnate ) <= this.life ) then
set this.life = 1.0
call SetWidgetLife( this.reincarnate, this.life )
endif
set this = this.next
endloop
endmethod
public static method actions takes nothing returns nothing
local thistype this = thistype.allocate( )
set this.next = 0
set this.prev = thistype( 0 ).prev
set this.next.prev = this
set this.prev.next = this
set this.dyingUnit = GetDyingUnit( )
set this.reincarnate = CreateUnit( GetOwningPlayer( this.dyingUnit ), 'h003', GetUnitX( this.dyingUnit ), GetUnitY( this.dyingUnit ), 0.0 )
set this.life = 1.0
call SetUnitPathing( this.reincarnate, false )
call SetWidgetLife( this.reincarnate, this.life )
if ( this.prev == 0 ) then
call TimerStart( thistype.period, 0.10, true, function thistype.iterate )
endif
endmethod
public static constant method conditions takes nothing returns boolean
return IsUnitType( GetDyingUnit( ), UNIT_TYPE_HERO )
endmethod
endstruct
public function Initialization takes nothing returns nothing
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerRegisterPlayerUnitEvent( herorevive.trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )
call TriggerAddCondition( herorevive.trig, Condition( function herorevive.conditions ) )
call TriggerAddAction( herorevive.trig, function herorevive.actions )
endfunction
endscope
Вот только если спрятать кнопку через HideAbilityButton( ), то способность ремонта зданий исчезает и не работает через ПКМ.
Советую проверять бекапы один за другим, и в том, в котором впервые возникает такая проблема, и искать ошибку, она наверняка где-то в изменениях относительно хронологически предыдущей версии.
Ну вопервых не сделаешь, клоны ожившего огня не настраивается,это багнутая абилка. Можно редактировать только оригинал. Во вторых орбы не стак, так что делай кастом оживший огонь.
Работает только оригинал , точнее с него настройки на все остальные идут клоны спелла, настройки смотри в опен доте, так то она работ, но вот орб и ннсовместтмость с другими пассивками, это не очень.
Эх, друг) ну я реализовал так. Есть в способностях замечательный закл перевоплащение иллидана. В нейтрально - враждебных. То есть ты создаешь двух героев у одного рэнжа 600 у другова 100 например, а этот спел меняет твоих героев местами(каждому там уже свои спец эффекты делаешь). Там есть еще у меха спел есть похожий, там без ограничения по времени, ну думаю идею ты понял.
Второй комп сломан поэтому проверить не могу, почему у меня подозрение, что оно должно работать.... Хотя могу и ошибаться, нормально делал карты года 2 назад.
тогда можно заменить исследование на создание юнита
здание создает определенного юнита -> повышаем уровень инвентаря
у этого способа есть несколько минусов:
одна иконка на всех уровнях улучшения
юнит не исчезнет на последнем уровне улучшения, а значит придется заменять здание на другое, но уже без этого юнита
EHP_Sequence, они лишь кажутся сложными. По сути триггеры в графическом виде интерпретируют язык программирования, на котором написана вся игра. Попробуй для начала в изначальном триггере добавить действия из категории Видимость - Disable Fog of War и Disable Black Mask, они откроют всю карту. Потом добавь действие из категории Игрок - самое первое, оно установит стартовое количество золота первому игроку. Порассматривав их и поразбиравшись, поймёшь, что это просто ещё дополнительные функции редактора.
А так по идее есть один вариант через Редактор объектов, который не проверял, потому что это зашквар какой-то) Найди для предмета способность Книга заклинаний, нажми Ctrl+D, чтобы слева в РО увидеть её равкод, добавь эту способность юниту, нажав Shift+Enter в поле способностей, и введя равкод книги, в книгу же добавь равкоды юнитов или предметов, которые хочешь сделать дополнительными.
Все просто: ты неправильно воспринял смысл этих условий.
Я, честно говоря, никогда не использовал такое условие, но есть мысль, что это условие подразумевает количество тех воиск, которые уже в атаке. Попробуй использовать другие условия.
брать группу юнитов, чекать позицию строителя\героя\здания, давать приказ на атаку в эту точку
или же дать обзор юнитам на всю карту и поставить радиус агра на всю карту
Почитай про утечки точек, как их создавать и удалять. Не знаю, как в твоём новом патче, но в 1.26 приказ отдаётся максимум 12 юнитам, у тебя может быть также, потому лучше отдавать приказ сразу после создания.
Предлагаю улучшить так:
Создать переменные для двух точек;
В триггере инициализации указать точкам значение центра областей 016 и 025;
Сделать периодический триггер с условием, что Король Мёртвых жив, а в действиях создание групп юнитов в одной точке, а сразу после создания приказ (Last Created Group) Перейти, нападая на противников, в другую точку;
По идее ещё бы отключить триггер за ненадобностью после смерти Короля Мёртвых, раз уж много таких триггеров, но всё равно изменение нагрузки будет незаметным, поэтому можно не отключать.
P. S. Утечка точки весит 0.361 кб, даже если не удалять утечки в этом триггере, то за 30 минут это будет 0.361х4х30=43.32 кб, что вполне приемлимо.
создать.
направить на 128 точек наверх(90)
сделать неперманентным
текст удалится через 3 секунды
текст затухнет до 100% прозрачности через 3 секунды
Вот чёрт. не успел приплюснуть к посту.
скрин скинул выше, но там ошибка. И если раскрыть, то обнаруживается еще одна утечка: на гуи Point(0,0), а на jass эта команда называется по-другому Location(0,0), эта функция создает точку
раскрыть
попробуй раскрутить, и использовать эту
native CreateItem takes integer itemid, real x, real y returns item
через CS: call CreateItem( id, GetUnitX(u), GetUnitY(u))
где id - ид-номер типа предмета, u - юнит. Ввести тип предмета, и юнита нужно.
можно еще запомнить как-то, чтобы к предмету как-то обращаться
через CS: set it = CreateItem( id, GetUnitX(u), GetUnitY(u))
где it - переменная предмета. Объявить переменную и обращаться
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
» WarCraft 3 / Проблемы с триггером в карте(1.26)
» WarCraft 3 / Процентный хил
» WarCraft 3 / Хеш-таблица
» WarCraft 3 / Баг с триггерами зависает wc3 и ломается поведение юнитов
» WarCraft 3 / Баг в карте юниты перестали ходить
» WarCraft 3 / Проблема с выбором цели в триггерах
» WarCraft 3 / Тим колор
» WarCraft 3 / Как изменить применение способности.
» WarCraft 3 / Восстановление здоровья
» WarCraft 3 / Пересадка отдельных анимации
» WarCraft 3 / Способность с процентом здоровья
» WarCraft 3 / Повторение триггера
» WarCraft 3 / Мгновенный поворот юнита
» WarCraft 3 / Баги со способностью оживший огонь в кампании
» WarCraft 3 / Приказ каждому юниту в регионе
» WarCraft 3 / Проблема с иконками
» WarCraft 3 / Смена типа атаки
» WarCraft 3 / Одновременно используются 3 способности на основе одной
» WarCraft 3 / Ошибка в тригере выбора расы
» WarCraft 3 / Почему мобы не идут?
» StarCraft 2 / Hots и LOTV
» WarCraft 3 / Дополнительные предметы
» WarCraft 3 / Атака на игроков
» WarCraft 3 / Утечки памяти
» WarCraft 3 / MPQ открывает только для чтения.